info->event_mask = event_mask;
info->time = time;
info->implicit = implicit;
- info->converted_implicit = FALSE;
/* Find the first grab that has a larger start time (if any) and insert
* before that. I.E we insert after already existing grabs with same
gboolean owner_events;
guint event_mask;
gboolean implicit;
- gboolean converted_implicit;
guint32 time;
gboolean activated;
return TRUE;
}
+#define GDK_ANY_BUTTON_MASK (GDK_BUTTON1_MASK | \
+ GDK_BUTTON2_MASK | \
+ GDK_BUTTON3_MASK | \
+ GDK_BUTTON4_MASK | \
+ GDK_BUTTON5_MASK)
+
static gboolean
proxy_button_event (GdkEvent *source_event,
gulong serial)
gdouble toplevel_x, toplevel_y;
GdkDisplay *display;
GdkWindowObject *w;
- GdkPointerGrabInfo *grab;
type = source_event->any.type;
toplevel_window = source_event->any.window;
time_ = gdk_event_get_time (source_event);
display = gdk_drawable_get_display (source_event->any.window);
- grab = _gdk_display_get_active_pointer_grab (display);
-
- if ((type == GDK_BUTTON_PRESS || type == GDK_SCROLL) &&
- grab && grab->window == toplevel_window &&
- grab->implicit && !grab->converted_implicit)
+ if (type == GDK_BUTTON_PRESS &&
+ _gdk_display_has_pointer_grab (display, serial) == NULL)
{
pointer_window =
_gdk_window_find_descendant_at (toplevel_window,
toplevel_x, toplevel_y,
NULL, NULL);
- /* Find the actual event window, its what gets the grab */
+ /* Find the event window, that gets the grab */
w = (GdkWindowObject *)pointer_window;
while (w != NULL && w->parent->window_type != GDK_WINDOW_ROOT)
{
w = w->parent;
}
pointer_window = (GdkWindow *)w;
-
- if (pointer_window != NULL &&
- pointer_window != toplevel_window)
- {
- g_object_ref (pointer_window);
- g_object_unref (grab->window);
- grab->window = pointer_window;
- grab->event_mask = gdk_window_get_events (pointer_window);
- }
-
- grab->converted_implicit = TRUE;
+
+ _gdk_display_add_pointer_grab (display,
+ pointer_window,
+ toplevel_window,
+ FALSE,
+ gdk_window_get_events (pointer_window),
+ serial,
+ time_,
+ TRUE);
+ _gdk_display_pointer_grab_update (display, serial);
}
pointer_window = get_pointer_window (display, toplevel_window,
button_release_grab =
_gdk_display_has_pointer_grab (display, serial);
if (button_release_grab &&
- button_release_grab->grab_one_pointer_release_event)
+ button_release_grab->implicit &&
+ (event->button.state & GDK_ANY_BUTTON_MASK & ~(GDK_BUTTON1_MASK << (event->button.button - 1))) == 0)
{
- button_release_grab->grab_one_pointer_release_event = FALSE;
button_release_grab->serial_end = serial;
button_release_grab->implicit_ungrab = TRUE;
_gdk_display_pointer_grab_update (display, serial);
set_user_time (window, event);
- /* We treat button presses as scroll wheel events, so don't expose
- * this grab to gtk, as it will be immediately released. If we do
- * expose it there is a short time before we receive the Release
- * where a client-side generated pointer motion event could be handled
- * as if the grab was effect.
- */
- if (!(xevent->xbutton.button == 4 || xevent->xbutton.button == 5 ||
- xevent->xbutton.button == 6 || xevent->xbutton.button == 7))
- _gdk_xgrab_check_button_event (window, xevent);
break;
case ButtonRelease:
if (!set_screen_from_root (display, event, xevent->xbutton.root))
return_val = FALSE;
- _gdk_xgrab_check_button_event (window, xevent);
-
break;
case MotionNotify:
_gdk_display_unset_has_keyboard_grab (display, TRUE);
}
-#define GDK_ANY_BUTTON_MASK (GDK_BUTTON1_MASK | \
- GDK_BUTTON2_MASK | \
- GDK_BUTTON3_MASK | \
- GDK_BUTTON4_MASK | \
- GDK_BUTTON5_MASK)
-
-/**
- * _gdk_xgrab_check_button_event:
- * @window: a #GdkWindow
- * @event: an XEvent of type ButtonPress or ButtonRelease
- *
- * Checks to see if a button event starts or ends an implicit grab.
- **/
-void
-_gdk_xgrab_check_button_event (GdkWindow *window,
- XEvent *xevent)
-{
- GdkDisplay *display = gdk_drawable_get_display (window);
- gulong serial = xevent->xany.serial;
- GdkPointerGrabInfo *grab;
-
- /* track implicit grabs for button presses */
- switch (xevent->type)
- {
- case ButtonPress:
- if (!_gdk_display_has_pointer_grab (display, serial))
- {
- _gdk_display_add_pointer_grab (display,
- window,
- window,
- FALSE,
- gdk_window_get_events (window),
- serial,
- xevent->xbutton.time,
- TRUE);
- }
- break;
- case ButtonRelease:
- serial = serial;
- grab = _gdk_display_has_pointer_grab (display, serial);
- if (grab && grab->implicit &&
- (xevent->xbutton.state & GDK_ANY_BUTTON_MASK & ~(GDK_BUTTON1_MASK << (xevent->xbutton.button - 1))) == 0)
- grab->grab_one_pointer_release_event = TRUE;
- break;
- default:
- g_assert_not_reached ();
- }
-}
-
void
_gdk_windowing_display_set_sm_client_id (GdkDisplay *display,
const gchar *sm_client_id)
void _gdk_xgrab_check_unmap (GdkWindow *window,
gulong serial);
void _gdk_xgrab_check_destroy (GdkWindow *window);
-void _gdk_xgrab_check_button_event (GdkWindow *window,
- XEvent *xevent);
gboolean _gdk_x11_display_is_root_window (GdkDisplay *display,
Window xroot_window);